/* arch/x86/include/arch/string.h 
 * 
 * Copyright (C) 2021, 2022 intirain. 
 *
 * This file is part of evx. 
 * 
 * evx is free software: you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 * 
 * evx is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with evx. If not, see <https://www.gnu.org/licenses/>
 */ 




#ifndef __ARCH_STRING_H
#define __ARCH_STRING_H


#ifndef __ASSEMBLER__



/* well... but in kernel, these are only required. */


#define memset(dest, v, n) ({				\
	__asm__ volatile (				\
		"cld\n\t"				\
		"rep\n\t"				\
		"stosb\n\t"				\
		:: "c" (n), "a" (v), "D" (dest)		\
	);						\
})



#define memcpy(dest, src, n) ({				\
	__asm__ volatile (				\
		"cld\n\t"				\
		"rep\n\t"				\
		"movsb\n\t"				\
		:: "c" (n), "S" (src), "D" (dest)	\
	);						\
})


#define strcpy(dest, src) ({ 				\
	__asm__ volatile (				\
		"cld\n\t"				\
		"1:\n\t"				\
		"lodsb\n\t"				\
		"stosb\n\t" 				\
		"testb %%al, %%al\n\t" 			\
		"jnz 1b\n\t"				\
		: "D" (dest), "S" (src)			\
		:: "ax"					\
	);						\
})


#endif

#endif
